var _ = require("lodash");
/**
 * 构建树，异步加载节点
 * @param treeEle 渲染树的元素
 * @param dataUrl 树节点数据加载地址
 * @param autoParam 树节点数据加载参数
 * @param ischeck 是否为复选树，true 是
 * @param onClick 树节点单击事件
 * @param beforeAsync 树节点加载前事件
 * @param onAsyncSuccess 树节点加载成功
 */
function constructSyncTree(treeEle, dataUrl, autoParam, checkSetting, onClick, onRightClick, beforeAsync, onAsyncSuccess) {
  // zTree 的参数配置，深入使用请参考 API 文档（setting 配置详解）
  var setting = {};
  if (checkSetting) {
    setting = {
      check: {
        enable: true,
        chkStyle: "checkbox",
        autoCheckTrigger: true,
        chkboxType: {
          "Y": "ps",
          "N": "ps"
          //Y 属性定义 checkbox 被勾选后的情况；
          // N 属性定义 checkbox 取消勾选后的情况；
          // "p" 表示操作会影响父级节点；
          // "s" 表示操作会影响子级节点。
        }
      },
      edit: {
        enable: true,
        showRemoveBtn: false,
        showRenameBtn: false,
        drag: {
          isCopy: false,
          isMove: true,
          inner: false
        }
      },
      data: {
        simpleData: {
          enable: false
          // 如果设置为 true，请务必设置 setting.data.simpleData 内的其他参数: idKey / pIdKey /
          // rootPId，并且让数据满足父子关系。
        }
      },
      view: {
        showLine: false, // 显示连接线
        showIcon: true, // 显示节点图片
        selectedMulti: false
        // fontCss: {color:"red"}
        // fontCss : setFontCss
        // 节点颜色
      },
      async: { // ztree异步请求数据
        enable: true,
        url: dataUrl, // 请求action方法
        type: "get",
        autoParam: [autoParam]
      },
      callback: {
        beforeDrag: beforeDrag,
        beforeDrop: beforeDrop,
        beforeAsync: beforeAsync,
        onAsyncSuccess: onAsyncSuccess,
        onClick: onClick,
        onRightClick: onRightClick
      }
    };
    _.merge(setting, { check: checkSetting });
  } else {
    setting = {
      edit: {
        enable: true,
        showRemoveBtn: false,
        showRenameBtn: false,
        drag: {
          isCopy: false,
          isMove: true,
          inner: false
        }
      },
      data: {
        simpleData: {
          enable: false
          // 如果设置为 true，请务必设置 setting.data.simpleData 内的其他参数: idKey / pIdKey /
          // rootPId，并且让数据满足父子关系。
        }
      },
      view: {
        showLine: false, // 显示连接线
        showIcon: true, // 显示节点图片
        selectedMulti: false
        // fontCss: {color:"red"}
        // fontCss : setFontCss
        // 节点颜色
      },
      async: { // ztree异步请求数据
        enable: true,
        url: dataUrl, // 请求action方法
        type: "get",
        autoParam: [autoParam]
      },
      callback: {
        beforeDrag: beforeDrag,
        beforeDrop: beforeDrop,
        beforeAsync: beforeAsync,
        onAsyncSuccess: onAsyncSuccess,
        onClick: onClick,
        onRightClick: onRightClick
      }
    };
  }

  var treeObj = $.fn.zTree.init(treeEle, setting, null);
  return treeObj;
}

/**
 *  构建树，一次性加载所有节点
 * @param treeEle 渲染树的元素
 * @param data 树节点数据
 * @param customSetting 自定义设置
 * @param ischeck 是否为复选树，true 是
 * @param onClick 树节点单击事件
 * @param onRightClick 树节点右击事件
 * @param beforeDragCb 拖动前树形callback
 * @param beforeDropCb 拖动放下树形callback
 */
function constructTree(treeEle, data, customSetting, checkSetting, onClick, onRightClick, beforeDragCb, beforeDropCb, treeEdit, addHoverDom, onRemove) {
  // zTree 的参数配置，深入使用请参考 API 文档（setting 配置详解）
  var setting = {};
  if (checkSetting) { //复选树配置
    setting = {
      check: {
        enable: true,
        autoCheckTrigger: true,
        chkboxType: {
          "Y": "",
          "N": ""
        }
      },
      edit: {
        enable: true,
        showRemoveBtn: false,
        showRenameBtn: false
      },
      data: {
        simpleData: {
          enable: false
        }
      },
      view: {
        showLine: false, // 显示连接线
        showIcon: true
        // 显示节点图片
        // fontCss: {color:"red"}
        // fontCss : setFontCss
        // 节点颜色
      },
      callback: {
        beforeDrag: beforeDrag,
        beforeDrop: beforeDrop,
        onRightClick: onRightClick,
        onClick: onClick
      }
    };
    _.merge(setting, checkSetting);
  } else {
    setting = {
      data: {
        simpleData: {
          enable: false
        }
      },
      edit: {
        enable: true,
        showRemoveBtn: false,
        showRenameBtn: false
      },
      view: {
        showLine: false, // 显示连接线
        showIcon: true
        // 显示节点图片
        // fontCss: {color:"red"}
        // fontCss : setFontCss
        // 节点颜色
      },
      callback: {
        beforeEditName: '',
        beforeDrag: beforeDrag.bind(this, beforeDragCb),
        beforeDrop: beforeDrop.bind(this, beforeDropCb),
        onRightClick: onRightClick,
        onClick: onClick
      }
    };
  }

  _.merge(setting, customSetting);
  if (treeEdit) {
    var editSet = {
      view: {
        addHoverDom: addHoverDom,
        removeHoverDom: removeHoverDom
      },
      callback: {
//              beforeDrag: function() {
//                  return false
//              }
      }
    }
    _.merge(setting, editSet);
  }
  var treeObj = $.fn.zTree.init(treeEle, setting, data);
  return treeObj;
}

function beforeDrag(cb, treeId, treeNodes) {
  for (var i = 0, l = treeNodes.length; i < l; i++) {
    if (treeNodes[i].drag === false) {
      return false;
    }
  }
  return cb ? cb() : true;
}

function beforeDrop(cb, treeId, treeNodes, targetNode, moveType) {
  if (targetNode && targetNode.drop == false) {
    return false;
  }
  return cb ? cb.call(this, treeId, treeNodes, targetNode, moveType) : true;
}

//2.26 新增
//function addHoverDom(treeId, treeNode) {
//  var sObj = $("#" + treeNode.tId + "_span"); //获取节点信息
//  if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
//
//  var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='add node' onfocus='this.blur();'></span>"; //定义添加按钮
//  sObj.after(addStr); //加载添加按钮
//  var btn = $("#addBtn_"+treeNode.tId);
//
//  //绑定添加事件，并定义添加操作
//  if (btn) btn.bind("click", function(){
//
//  });
//};

function removeHoverDom(treeId, treeNode) {
  $("#addBtn_" + treeNode.tId).unbind().remove();
  $("#editBtn_" + treeNode.tId).unbind().remove();
  $("#removeBtn_" + treeNode.tId).unbind().remove();
};



export {
  constructSyncTree,
  constructTree
}
